package com.bjtu.ptsite.service;


import com.bjtu.ptsite.model.PageResult;
import com.bjtu.ptsite.model.Result;
import com.bjtu.ptsite.model.User;
import com.bjtu.ptsite.model.UserDTO;

import java.math.BigDecimal;
import java.util.List;

/**
 *
 * @author Zehao Wang, Junjie Zhang, Yutao Wei
 *
 */
public interface UserService {

    /**
     * 用户登录方法，验证用户身份
     *
     * @param user 包含用户名和密码的用户对象
     * @return 登录成功返回完整用户信息，失败返回null
     */
    User login(User user);

    /**
     * 检查用户名是否已存在
     *
     * @param username 待检查的用户名
     * @return 存在返回true，否则false
     */
    boolean isUsernameExists(String username);
    /**
     * 检查邮箱是否已存在
     *
     * @param email 待检查的邮箱
     * @return 存在返回true，否则false
     */
    boolean isEmailExists(String email);
    /**
     * 用户注册方法
     *
     * @param user 注册用户信息
     */
    void register(User user);
    /**
     * 发送验证码到指定邮箱
     *
     * @param email   接收验证码的邮箱
     * @param request 验证码类型（如注册、找回密码等）
     */
    void sendVerificationCode(String email,int request);
    /**
     * 验证邮箱验证码
     *
     * @param email 邮箱地址
     * @param code  验证码
     * @return 验证通过返回true，否则false
     */
    boolean verifyCode(String email, String code);
    /**
     * 根据用户ID获取用户信息
     *
     * @param userId 用户ID
     * @return 用户对象
     */
    User getUserById(int userId);
    /**
     * 更新用户个人资料
     *
     * @param userId    用户ID
     * @param updateDTO 包含更新信息的数据传输对象
     * @return 更新后的用户对象
     */
    User updateUserProfile(Integer userId, UserDTO updateDTO);
    /**
     * 重置用户密码
     *
     * @param userId      用户ID
     * @param newPassword 新密码
     * @return 重置成功返回true，否则false
     */
    boolean resetPassword(int userId, String newPassword);

    /**
     * 更新用户流量信息
     *
     * @param passKey        用户通行证密钥
     * @param uploadedDelta  上传流量增量
     * @param downloadedDelta 下载流量增量
     */
    void updateUserTraffic(String passKey, long uploadedDelta, long downloadedDelta);
    /**
     * 更新用户头像
     *
     * @param userId    用户ID
     * @param avatarUrl 头像URL
     */
    void updateAvatar(int userId, String avatarUrl);

    /**
     * 根据用户ID获取头像URL
     *
     * @param userId 用户ID
     * @return 头像URL
     */
    String getAvatarById(int userId);
    /**
     * 关注用户
     *
     * @param curUserId 当前用户ID
     * @param userId    被关注用户ID
     */
    void followUser(int curUserId, int userId);
    /**
     * 取消关注用户
     *
     * @param curUserId 当前用户ID
     * @param userId    被取消关注用户ID
     */
    void deFollowUser(int curUserId, int userId);
    /**
     * 检查是否已关注
     *
     * @param curUserId 当前用户ID
     * @param userId    目标用户ID
     * @return 已关注返回true，否则false
     */
    boolean isFollowExits(int curUserId, int userId);
    /**
     * 获取用户关注列表
     *
     * @param userId 用户ID
     * @return 关注列表
     */
    List<UserDTO> getFollows(int userId);
    /**
     * 获取用户粉丝列表
     *
     * @param userId 用户ID
     * @return 粉丝列表
     */
    List<UserDTO> getFans(int userId);
    /**
     * 升级符合条件的用户
     */
    void upgradeQualifiedUsers();
    /**
     * 封禁用户
     *
     * @param userId 用户ID
     */
    void banUser(int userId);
    /**
     * 解封用户
     *
     * @param userId 用户ID
     */
    void unbanUser(int userId);
    /**
     * 更新用户流量信息（通过种子积分）
     *
     * @param user 用户对象
     */
    void updateUserTraffic2(User user);
    /**
     * 获取用户列表
     *
     * @param page 页码
     * @param size 每页大小
     * @return 用户列表
     */
    PageResult<User> getUserList(int page, int size);

    /**
     * 获取用户列表
     */
    void countSharingRate();

    /**
     * 获取用户列表
     * @param user 用户对象
     */
    void dailyAward(User user);
    /**
     * 获取用户列表
     */
    void resetDailyAward();
    void dailyAssess();
}
